package cn.tsingmo.otproxy.server;

import cn.tsingmo.otproxy.security.AuthenticationHandler;
import cn.tsingmo.otproxy.security.DecryptionHandler;
import cn.tsingmo.otproxy.security.EncryptionHandler;
import cn.tsingmo.otproxy.security.EncryptionService;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

/**
 * 服务端Channel初始化器
 * 配置TCP连接的处理 pipeline，包括编解码、加解密和业务逻辑处理
 */
public class ServerInitializer extends ChannelInitializer<SocketChannel> {
    // 加密服务实例
    private final EncryptionService encryptionService;

    /**
     * 构造函数
     * @param encryptionService 加密服务实例
     */
    public ServerInitializer(EncryptionService encryptionService) {
        this.encryptionService = encryptionService;
    }

    /**
     * 初始化ChannelPipeline
     * @param ch 客户端SocketChannel
     */
    @Override
    protected void initChannel(SocketChannel ch) {
        ChannelPipeline pipeline = ch.pipeline();

        // 添加日志处理器（用于调试）
        pipeline.addLast(new LoggingHandler(LogLevel.INFO));

        // 帧解码器：解决TCP粘包/拆包问题
        // 长度字段占4字节，位于消息头部，大端模式
        pipeline.addLast(new LengthFieldBasedFrameDecoder(
                Integer.MAX_VALUE, 0, 4, 0, 4));

        // 帧编码器：在发送消息前添加长度字段
        pipeline.addLast(new LengthFieldPrepender(4));

        // 解密处理器：先解密收到的数据
        pipeline.addLast(new DecryptionHandler(encryptionService));

        // 加密处理器：后加密要发送的数据
        pipeline.addLast(new EncryptionHandler(encryptionService));

        // 认证处理器：验证客户端身份
        pipeline.addLast(new AuthenticationHandler());

        // 服务端连接处理器：处理代理业务逻辑
        pipeline.addLast(new ServerConnectionHandler());
    }
}